<?php

namespace app\api\controller;

use app\api\model\CreateVoteDescribeModel;
use app\api\model\UserVoteModel;
use app\common\controller\Api;
use app\common\library\Ems;
use app\common\library\Sms;
use fast\Random;
use think\Db;
use think\Validate;
use app\api\model\CreateVoteModel;

/**
 * 会员接口
 */
class User extends Api
{
    protected $noNeedLogin = ['jscode2session','login', 'mobilelogin', 'register', 'resetpwd', 'changeemail', 'changemobile', 'third'];
    protected $noNeedRight = '*';

    public function _initialize()
    {
        parent::_initialize();
    }

    /**
     * 会员中心
     */
    public function index()
    {
        $this->success('', ['welcome' => $this->auth->nickname]);
    }

    /**
     * 用户是否存在
     */
    public function jscode2session(){
        $post = $this->request->post();

        if (!isset($post['code']) || empty($post['code'])){
            $this->error('code不存在');
        }

        if (isset($post['code'])&&!empty($post['code'])){
            $code = $post['code'];
            $appid = config('douyin_appid');
            $appsecret = config('douyin_appsecrect');
            $url = "https://developer.toutiao.com/api/apps/jscode2session?appid=".$appid."&secret=".$appsecret."&code=".$code;
            $ret = curl_get($url);
            $arr = json_decode($ret,true);

            if ($arr['error']==0){
                $openid= $arr['openid'];
            }else{
                $this->error('配置异常','',3);
            }
        }
        if (!isset($openid)){
            $this->error('参数不存在');
        }
        if (empty($openid)){
            $this->error('参数为空');
        }
        $openid_user = Db::name('user')->where(array('openid'=>$openid))->find();
        if (empty($openid_user)){
            //没有用户就注册
            $data['avatar'] = $post['avatar'];
            $data['nickname'] = $post['nickName'];
            $data['username'] = $post['nickName'];
            $data['gender'] = $post['gender'];
            $data['status'] = 'normal';
            $data['openid'] = $openid;
            if (isset($data['avatar'])&&isset($data['username'])&&isset($data['gender'])&&isset($data['openid'])){
                $data = Db::name('user')->insert($data);
                if ($data!==0){
                    self::login($openid);
                }else{
                    $this->error('出现异常，请联系网站管理员');
                }
            }else{
                $this->error('非法请求');
            }
        }else{
            //有用户就登陆
            self::login($openid);
        }
    }

    /**
     * 会员登录
     *
     * @param string $account  账号
     * @param string $password 密码
     */
    private function login($openid)
    {
        $ret = $this->auth->loginToken($openid);
        if ($ret) {
            $data = ['userinfo' => $this->auth->getUserinfo()];
            $this->success(__('Logged in successful'), $data);
        } else {
            $this->error($this->auth->getError());
        }
    }

    /**
     * 手机验证码登录
     *
     * @param string $mobile  手机号
     * @param string $captcha 验证码
     */
    public function mobilelogin()
    {
        $mobile = $this->request->request('mobile');
        $captcha = $this->request->request('captcha');
        if (!$mobile || !$captcha) {
            $this->error(__('Invalid parameters'));
        }
        if (!Validate::regex($mobile, "^1\d{10}$")) {
            $this->error(__('Mobile is incorrect'));
        }
        if (!Sms::check($mobile, $captcha, 'mobilelogin')) {
            $this->error(__('Captcha is incorrect'));
        }
        $user = \app\common\model\User::getByMobile($mobile);
        if ($user) {
            if ($user->status != 'normal') {
                $this->error(__('Account is locked'));
            }
            //如果已经有账号则直接登录
            $ret = $this->auth->direct($user->id);
        } else {
            $ret = $this->auth->register($mobile, Random::alnum(), '', $mobile, []);
        }
        if ($ret) {
            Sms::flush($mobile, 'mobilelogin');
            $data = ['userinfo' => $this->auth->getUserinfo()];
            $this->success(__('Logged in successful'), $data);
        } else {
            $this->error($this->auth->getError());
        }
    }

    /**
     * 注册会员
     *
     * @param string $username 用户名
     * @param string $password 密码
     * @param string $email    邮箱
     * @param string $mobile   手机号
     * @param string $code   验证码
     */
    public function register()
    {
        $username = $this->request->request('username');
        $password = $this->request->request('password');
        $email = $this->request->request('email');
        $mobile = $this->request->request('mobile');
        $code = $this->request->request('code');
        if (!$username || !$password) {
            $this->error(__('Invalid parameters'));
        }
        if ($email && !Validate::is($email, "email")) {
            $this->error(__('Email is incorrect'));
        }
        if ($mobile && !Validate::regex($mobile, "^1\d{10}$")) {
            $this->error(__('Mobile is incorrect'));
        }
        $ret = Sms::check($mobile, $code, 'register');
        if (!$ret) {
            $this->error(__('Captcha is incorrect'));
        }
        $ret = $this->auth->register($username, $password, $email, $mobile, []);
        if ($ret) {
            $data = ['userinfo' => $this->auth->getUserinfo()];
            $this->success(__('Sign up successful'), $data);
        } else {
            $this->error($this->auth->getError());
        }
    }

    /**
     * 注销登录
     */
    public function logout()
    {
        $this->auth->logout();
        $this->success(__('Logout successful'));
    }

    /**
     * 修改会员个人信息
     *
     * @param string $avatar   头像地址
     * @param string $username 用户名
     * @param string $nickname 昵称
     * @param string $bio      个人简介
     */
    public function profile()
    {
        $user = $this->auth->getUser();
        $username = $this->request->request('username');
        $nickname = $this->request->request('nickname');
        $bio = $this->request->request('bio');
        $avatar = $this->request->request('avatar', '', 'trim,strip_tags,htmlspecialchars');
        if ($username) {
            $exists = \app\common\model\User::where('username', $username)->where('id', '<>', $this->auth->id)->find();
            if ($exists) {
                $this->error(__('Username already exists'));
            }
            $user->username = $username;
        }
        $user->nickname = $nickname;
        $user->bio = $bio;
        $user->avatar = $avatar;
        $user->save();
        $this->success();
    }

    /**
     * 修改邮箱
     *
     * @param string $email   邮箱
     * @param string $captcha 验证码
     */
    public function changeemail()
    {
        $user = $this->auth->getUser();
        $email = $this->request->post('email');
        $captcha = $this->request->request('captcha');
        if (!$email || !$captcha) {
            $this->error(__('Invalid parameters'));
        }
        if (!Validate::is($email, "email")) {
            $this->error(__('Email is incorrect'));
        }
        if (\app\common\model\User::where('email', $email)->where('id', '<>', $user->id)->find()) {
            $this->error(__('Email already exists'));
        }
        $result = Ems::check($email, $captcha, 'changeemail');
        if (!$result) {
            $this->error(__('Captcha is incorrect'));
        }
        $verification = $user->verification;
        $verification->email = 1;
        $user->verification = $verification;
        $user->email = $email;
        $user->save();

        Ems::flush($email, 'changeemail');
        $this->success();
    }

    /**
     * 修改手机号
     *
     * @param string $mobile   手机号
     * @param string $captcha 验证码
     */
    public function changemobile()
    {
        $user = $this->auth->getUser();
        $mobile = $this->request->request('mobile');
        $captcha = $this->request->request('captcha');
        if (!$mobile || !$captcha) {
            $this->error(__('Invalid parameters'));
        }
        if (!Validate::regex($mobile, "^1\d{10}$")) {
            $this->error(__('Mobile is incorrect'));
        }
        if (\app\common\model\User::where('mobile', $mobile)->where('id', '<>', $user->id)->find()) {
            $this->error(__('Mobile already exists'));
        }
        $result = Sms::check($mobile, $captcha, 'changemobile');
        if (!$result) {
            $this->error(__('Captcha is incorrect'));
        }
        $verification = $user->verification;
        $verification->mobile = 1;
        $user->verification = $verification;
        $user->mobile = $mobile;
        $user->save();

        Sms::flush($mobile, 'changemobile');
        $this->success();
    }

    /**
     * 第三方登录
     *
     * @param string $platform 平台名称
     * @param string $code     Code码
     */
    public function third()
    {
        $url = url('user/index');
        $platform = $this->request->request("platform");
        $code = $this->request->request("code");
        $config = get_addon_config('third');
        if (!$config || !isset($config[$platform])) {
            $this->error(__('Invalid parameters'));
        }
        $app = new \addons\third\library\Application($config);
        //通过code换access_token和绑定会员
        $result = $app->{$platform}->getUserInfo(['code' => $code]);
        if ($result) {
            $loginret = \addons\third\library\Service::connect($platform, $result);
            if ($loginret) {
                $data = [
                    'userinfo'  => $this->auth->getUserinfo(),
                    'thirdinfo' => $result
                ];
                $this->success(__('Logged in successful'), $data);
            }
        }
        $this->error(__('Operation failed'), $url);
    }

    /**
     * 重置密码
     *
     * @param string $mobile      手机号
     * @param string $newpassword 新密码
     * @param string $captcha     验证码
     */
    public function resetpwd()
    {
        $type = $this->request->request("type");
        $mobile = $this->request->request("mobile");
        $email = $this->request->request("email");
        $newpassword = $this->request->request("newpassword");
        $captcha = $this->request->request("captcha");
        if (!$newpassword || !$captcha) {
            $this->error(__('Invalid parameters'));
        }
        if ($type == 'mobile') {
            if (!Validate::regex($mobile, "^1\d{10}$")) {
                $this->error(__('Mobile is incorrect'));
            }
            $user = \app\common\model\User::getByMobile($mobile);
            if (!$user) {
                $this->error(__('User not found'));
            }
            $ret = Sms::check($mobile, $captcha, 'resetpwd');
            if (!$ret) {
                $this->error(__('Captcha is incorrect'));
            }
            Sms::flush($mobile, 'resetpwd');
        } else {
            if (!Validate::is($email, "email")) {
                $this->error(__('Email is incorrect'));
            }
            $user = \app\common\model\User::getByEmail($email);
            if (!$user) {
                $this->error(__('User not found'));
            }
            $ret = Ems::check($email, $captcha, 'resetpwd');
            if (!$ret) {
                $this->error(__('Captcha is incorrect'));
            }
            Ems::flush($email, 'resetpwd');
        }
        //模拟一次登录
        $this->auth->direct($user->id);
        $ret = $this->auth->changepwd($newpassword, '', true);
        if ($ret) {
            $this->success(__('Reset password successful'));
        } else {
            $this->error($this->auth->getError());
        }
    }

    /**
     * 我的创建的投票
     * @throws \think\db\exception\DataNotFoundException
     * @throws \think\db\exception\ModelNotFoundException
     * @throws \think\exception\DbException
     */
    public function myCreate(){
        $getUserinfo = $this->auth->getUserinfo();
        $p = $this->request->get("p");
        //分页
        if (isset($p) && intval($p) >1) {
            $p = intval($p);
        }else {
            $p = 1;
        }
        $pagesize = 8;#每页数量
        $offset = $pagesize*($p-1);//计算记录偏移量
        //我创建的投票 显示标题和参与人数
        $create_vote = CreateVoteModel::getInstance()->field('id,title,deadline,create_time')->where(array('user_id'=>$getUserinfo['id']))->limit($offset,$pagesize)->order('create_time desc')->select();
        foreach ($create_vote as $k=>$v){
            //投票选项，图片，描述
            $create_vote_describe = CreateVoteDescribeModel::getInstance()->field('id,img,describe')->where(array('crate_vote_id'=>$v['id']))->select()->toArray();
            $create_vote_describe_arr = array_column($create_vote_describe,'id');
            $user_cont = UserVoteModel::getInstance()->field('id')->where(array('create_vote_describe_id'=>array('in',$create_vote_describe_arr)))->group('user_id')->select();
            $create_vote[$k]['vote_sum'] = count($user_cont);
        }
        if (empty($create_vote)){
            $this->error('暂无数据');
        }else{
            $this->success('获取数据成功',$create_vote);
        }
    }

    /**
     * 我的参与
     * @throws \think\db\exception\DataNotFoundException
     * @throws \think\db\exception\ModelNotFoundException
     * @throws \think\exception\DbException
     */
    public function myPartake(){
        $getUserinfo = $this->auth->getUserinfo();
        $p = $this->request->get("p");
        //分页
        if (isset($p) && intval($p) >1) {
            $p = intval($p);
        }else {
            $p = 1;
        }
        $pagesize = 8;#每页数量
        $offset = $pagesize*($p-1);//计算记录偏移量
        $create_vote_describe_id = UserVoteModel::getInstance()
            ->alias('uv')
            ->distinct(true)
            ->field('cv.id,cv.title')
            ->join('create_vote_describe cvd','cvd.id=uv.create_vote_describe_id','left')
            ->join('create_vote cv','cv.id=cvd.crate_vote_id','left')
            ->where(array('uv.user_id'=>$getUserinfo['id']))
            ->group('uv.create_vote_describe_id')
            ->order('uv.create_time desc')
            ->limit($offset,$pagesize)
            ->select()->toArray();
        $this->success('获取数据成功', $create_vote_describe_id);
    }
}
